
接下來的幾天會分別介紹四個屬性,並互相比較倆倆之間差異和使用時機。
如果在模版內加入太多的邏輯運算,不但顯得雜亂也難以維護。
例如:在顯示預設的字串「Hello Vue!」之下,再顯示反轉後的字串。
附上 fiddle (https://jsfiddle.net/hunterliu/4jbwwur7/1/)
<div id="app">
  <p>原始訊息:{{ message }}</p>
  <p>反轉訊息:{{ message.split('').reverse().join('') }}</p>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
});
若改用 computed 則較容易閱讀,也把運算邏輯從 HTML 拆出來了。
附上 fiddle (https://jsfiddle.net/hunterliu/y7ztd5dg/)
<div id="example">
  <p>Original message: "{{ message }}"</p>
  <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  computed: {
    reversedMessage: function () {
      return this.message.split('').reverse().join('')
    }
  }
})
若使用 method 改寫上例,也能得到相同的效果。
附上 fiddle (https://jsfiddle.net/hunterliu/xoywrh40/)
<div id="example">
  <p>Reversed message: "{{ reverseMessage() }}"</p>
</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello Vue!'
  },
  methods: {
    reverseMessage: function () {
      return this.message.split('').reverse().join('')
    }
  }
})
差異:
當定義 computed 之後,其相依的 data 或是 component 中的 props(之後會提到) 改變,computed 也會隨之更新;methods 則是不管資料是否相依都會計算。
下例的 computed 中沒有相依的 data,因此在 message 被修改時,now 沒有被更新,但 methods 會重新計算更新 getNow 的值。
附上 fiddle (https://jsfiddle.net/hunterliu/hw23hrn2/2/)
<div id="app">
  <p>message:{{ message }}</p>
  <p>now (computed):{{ now }}</p>
  <p>getNow (method):{{ getNow() }}</p>
</div>
var vm = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  },
  computed: {
    now: function() {
      return Date.now();
    }
  },
  methods: {
    getNow: function() {
      return Date.now();
    }
  }
});
vm.$data.message = 'message changed';